package pe.com.bbva.configuracion.bo.impl;

import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.com.bbva.configuracion.bo.CorreoBO;
import pe.com.bbva.configuracion.dao.CorreoDAO;
import pe.com.bbva.configuracion.domain.Correo;
import pe.com.stefanini.core.bo.GenericBOImpl;
import pe.com.stefanini.core.bo.Grid;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("correoBO")
public class CorreoBOImpl extends GenericBOImpl<Correo> implements CorreoBO{
	Logger logger = Logger.getLogger(this.getClass());
	@Resource
	private CorreoDAO correoDAO;
	
	public Correo findById(Long id) throws BOException {
		Correo correo = super.findById(Correo.class, id);
		return correo;
	}
	
	public Correo findByIncidencia(Long id) throws BOException, DAOException {
		Correo correo = correoDAO.findCorreoIncidencia(id);
		return correo;
	}

	public List<Correo> findCorreos(Correo correo)
			throws BOException, DAOException {
		List<Correo> listaCorreos = correoDAO.findCorreos(correo);
		return listaCorreos;
	}
	
	public List<Correo> findCorreosByProceso()
		throws BOException, DAOException {
		List<Correo> listaCorreos = correoDAO.findCorreosByProceso();
		return listaCorreos;
	}

	public boolean validate(Correo correo) throws BOException{
		boolean valido = false;
		try {
			if(correo.getId()==null){
				if(correo.getIncidencia()==null || correo.getIncidencia().equals("")){
					Correo correoBusca = new Correo();
					correoBusca.setTipoCorreo(correo.getTipoCorreo());
					List<Correo> lista = findCorreos(correoBusca);
					if(lista==null || lista.isEmpty()){
						valido = true;
					}
				}else{
					valido = true;
				}
			}else{
				valido = true;
			}
		} catch (DAOException e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new BOException(e.getMessage());
		}
		return valido;
	}
	
	public Grid<Correo> findToGrid(Correo correo, String order, int page, int rows)
	throws BOException, DAOException {
		String where="where ";	
		List<Correo> listaCorreo = findCorreosByProceso();
	    return super.findToGridList(listaCorreo, where, " order by "+order,page,rows);
	}
	
	@Transactional(propagation=Propagation.REQUIRED)
	public void save(Correo correo) throws BOException, DAOException {
		super.save(correo);
	}
	
	public List<Correo> findCorreoListByDescrip(String descripcion) throws BOException {
		List<Correo> lista = null;
		try {
			HashMap<String, String> correos = new HashMap<String, String>();
			correos.put("descripcion", descripcion);
			lista = super.findByParams(Correo.class, correos);
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new BOException(e.getMessage());
		}
		return lista;
	}
	
	public void update(Correo correo) throws BOException {			
		try {
			super.doSave(correo);
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new BOException(e.getMessage());
		}
	}
	
	@Transactional(propagation=Propagation.REQUIRED , rollbackFor ={BOException.class})
	public Long  ValidaCargaEnProceso() throws BOException {
		Long idArchivo = 0L;		
		try {
			idArchivo = correoDAO.ValidaCargaEnProceso();
		} catch (DAOException e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new BOException(e.getMessage());
		}
		return idArchivo;
	}
}